﻿using System;
using System.IO;
using System.Linq;
using System.Text;
using Elmah;
using MIAP.Negocio;
using MIAP.Negocio.Utiles;
using ApplicationException = Elmah.ApplicationException;
using MailMessage = System.Net.Mail.MailMessage;
using MailAttachment = System.Net.Mail.Attachment;

namespace MIAPWEB.Elmah
{
    /// <summary>
    /// Sobreescritura de la calse ErrorMailModule que no permitira el envio de correos con nuestro servidor de corero
    /// </summary>
    public class LocalErrorMailModule : ErrorMailModule
    {
        /// <summary>
        /// Metodo encargado de enviar el correo
        /// </summary>
        /// <param name="mail"></param>
        protected override void SendMail(MailMessage mail)
        {
            if (mail == null)
                throw new ArgumentNullException("mail");            

            var negocio = new ConfiguracionNegocio();
            var user = negocio.GetNombreUserCorreo().Descripcion;
            var passw = negocio.GetNombrePasswordcorreo().Descripcion;
            var dominio = negocio.GetNombreDominioCorreo().Descripcion;
            var from = negocio.GetFromEnvioCorreo().Descripcion;
            if (!EnvioCorreoNegocio.CanAccesExchange(user, passw, dominio, @from)) return;

            var envioNegocio = new EnvioCorreoNegocio(user, passw, dominio, @from);

            envioNegocio.EnviarCorreo(this.MailRecipient.Split(';').ToList(), mail.Body, mail.Subject);
        }

        /// <summary>
        /// Metodo encargado de construir el reporde de error y enviar el correo
        /// </summary>
        /// <param name="error"></param>
        protected override void ReportError(Error error)
        {
            if (error == null)
                throw new ArgumentNullException("error");

            var mail = new MailMessage();
            mail.Priority = this.MailPriority;

            var subjectFormat = this.MailSubjectFormat;
            mail.Subject = string.Format(subjectFormat, error.Message, error.Type).Replace('\r', ' ').Replace('\n', ' ');

            var formatter = CreateErrorFormatter();

            var bodyWriter = new StringWriter();
            formatter.Format(bodyWriter, error);
            mail.Body = bodyWriter.ToString();

            switch (formatter.MimeType)
            {
                case "text/html": mail.IsBodyHtml = true; break;
                case "text/plain": mail.IsBodyHtml = false; break;

                default:
                    {
                        throw new ApplicationException(string.Format(
                            "The error mail module does not know how to handle the {1} media type that is created by the {0} formatter.",
                            formatter.GetType().FullName, formatter.MimeType));
                    }
            }

            var args = new ErrorMailEventArgs(error, mail);

            try
            {
                if (!NoYsod && error.WebHostHtmlMessage.Length > 0)
                {
                    var ysodAttachment = CreateHtmlAttachment("YSOD", error.WebHostHtmlMessage);

                    if (ysodAttachment != null)
                        mail.Attachments.Add(ysodAttachment);
                }
                OnMailing(args);
                SendMail(mail);
                OnMailed(args);
            }
            finally
            {
                OnDisposingMail(args);

            }
        }

        /// <summary>
        /// Crea la pagina HTML adjunta al correo
        /// </summary>
        /// <param name="name"></param>
        /// <param name="html"></param>
        /// <returns></returns>
        private static MailAttachment CreateHtmlAttachment(string name, string html)
        {
            return MailAttachment.CreateAttachmentFromString(html,
                name + ".html", Encoding.UTF8, "text/html");
        }

        /// <summary>
        /// sobreescritura de la propiedad de recipientes la cual obtenemos de la base de datos de la tabla de configuración
        /// </summary>
        protected override string MailRecipient
        {
            get { return new ConfiguracionNegocio().GetFromCorreosErrores().Descripcion; }
        }
    }
}